//
// Created by 86138 on 2025/5/20.
//
#include "LinkQueue.h"

void InitQueue(LinkQueue &Q) {
    Q.front = Q.rear = (PtrToQNode) malloc(sizeof(QNode));
    if (!Q.front) exit(OVERFLOW);
    Q.front->Next = NULL;
}

void DestroyQueue(LinkQueue &Q) {
//    QNode *p;
//    while (Q.front) {
//        p = Q.front->Next;
//        free(Q.front);
//        Q.front = p;
//    }
    // 仿造LinkList的销毁方法
    QNode *p;
    while (Q.front) {
        p = Q.front;
        Q.front = Q.front->Next;
        free(p);
    }
}

Status EnQueue(LinkQueue &Q, QElemType e) {
    QNode *p = (QNode *) malloc(sizeof(QNode));
    if (!p) exit(OVERFLOW);
    p->Data = e;
    p->Next = NULL;
    Q.rear->Next = p;
    Q.rear = p;
    return OK;
}

Status DeQueue(LinkQueue &Q, QElemType &e) {
    if (Q.front == Q.rear) {
        printf("队列为空，不能出队\n");
        return ERROR;
    }
    QNode *p;
    p = Q.front->Next;
    e = p->Data;
    Q.front->Next = p->Next;
    if (Q.rear == p) {
        Q.rear = Q.front;
    }
    free(p);

    return OK;
}

Status GetHead(LinkQueue Q, QElemType &e) {
    if (Q.front == Q.rear) {
        printf("队列为空，不能获取队头元素\n");
        return ERROR;
    }
    e = Q.front->Next->Data;
    return OK;
}

//int main() {
//    system("chcp 65001");
//    LinkQueue Q;
//    InitQueue(Q);
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    EnQueue(Q, 5);
//    EnQueue(Q, 6);
//    EnQueue(Q, 7);
//    int e;
//    DeQueue(Q, e);
//
//    PtrToQNode p = Q.front->Next;
//    while (p) {
//        printf("%d ", p->Data);
//        p = p->Next;
//    }
//
//    DestroyQueue(Q);
//    return 0;
//}